import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;


/**
 * TODO 该类放置项目路径：/src/test/java
 */
public class Generator {
    // 工程路径
    private static final String PROJECT_PACKAGE = Generator.class.getClassLoader()
            .getResource("")
            .getPath()
            .replace("/target/test-classes/", "")
            .substring(1);
    // java包路径
    private static String MODEL_JAVA_PACKAGE = PROJECT_PACKAGE + "/src/main/java";
    // resources包路径
    private static String MODEL_RES_PACKAGE = PROJECT_PACKAGE + "/src/main/resources";

    // TODO 根据项目类路径修改
    //  生成文件的父包路径
    private static final String PARENT_PACKAGE = "com.zyk.scaffold.seata.biz";
    // 生成文件的业务包路径
    private static final String BUSINESS_PACKAGE = "repositorys";

    // TODO 根据项目数据库表名修改
    // 要生成的数据库表名
    private static final String[] TABLE_NAMES = new String[]{
            "biz_money"
    };
    // 文件创建者信息
    private static final String AUTHOR_NAME = "zhouyk";

    // TODO 根据项目数据库配置修改
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1:3306/scaffold_seata_biz?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
        String userName = "root";
        String password = "root";
        generate(url, userName, password);
    }

    /**
     * @param url         数据库地址
     * @param userName    用户名
     * @param password    密码
     */
    public static void generate(String url, String userName, String password) {
        // ===============  全局配置  ==================
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(MODEL_JAVA_PACKAGE)
                .setActiveRecord(true)          // 是否支持 AR, 实体类只需继承 Model 类即可进行强大的 CRUD 操作
                .setAuthor(AUTHOR_NAME)          // 设置作者名字
                .setFileOverride(false)          // 文件覆盖(全新文件)
                .setIdType(IdType.AUTO)         // 主键策略
                .setBaseResultMap(true)         // SQL 映射文件
                .setBaseColumnList(true)        // SQL 片段
                .setServiceName("%sRepository")    // service的名字
                .setServiceImplName("%sRepositoryImpl")    // service的名字
                .setOpen(false);

        // =================  数据源配置   ===============
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL)
                .setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUrl(url)
                .setUsername(userName)
                .setPassword(password);

        // =================  包配置  ===================
        PackageConfig pc = new PackageConfig();
        pc.setParent(PARENT_PACKAGE)                        // 配置父包路径
                .setModuleName(BUSINESS_PACKAGE)            // 配置业务包路径
                .setMapper("mapper")
                .setEntity("entity")
                .setService("interfaces")
                .setServiceImpl("impl");

        // ==================  自定义配置  =================
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        // 调整 xml 生成目录演示
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return MODEL_RES_PACKAGE + "/mybatis/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

        cfg.setFileOutConfigList(focList);
        // ===================  策略配置  ==================
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel)                   // 表名命名：  underline_to_camel 底线变驼峰
                .setColumnNaming(NamingStrategy.underline_to_camel)             // 字段命名： underline_to_camel 底线变驼峰
                .setInclude(TABLE_NAMES)                                         // 需要生成的 表名
                .setCapitalMode(true)                                           // 全局大写命名 ORACLE 注意
                .setEntityLombokModel(true);                                     // 是否加入lombok

        // ==================  自定义模板配置： 默认配置位置 mybatis-plus/src/main/resources/templates  ======================
        // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置，也可以自定义模板名称
        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null)                                                         // 设置生成xml的模板
                .setEntity("/templates/entity.java")                            // 设置生成entity的模板
                .setMapper("/templates/mapper.java")                            // 设置生成mapper的模板
                .setController(null)                    // 设置生成controller的模板
                .setService("/templates/repository.java")
                .setServiceImpl("/templates/repositoryImpl.java");

        // ====================  生成配置  ===================
        AutoGenerator mpg = new AutoGenerator();
        mpg.setCfg(cfg)
                .setTemplate(tc)
                .setGlobalConfig(gc)
                .setDataSource(dsc)
                .setPackageInfo(pc)
                .setStrategy(strategy)
                .setTemplateEngine(new FreemarkerTemplateEngine());             // 选择 freemarker引擎，注意 pom 依赖必须有！
        mpg.execute();
    }

}
